package com.itheima.tlias.mapper.sql;

import com.itheima.tlias.model.dto.EmpQueryDTO;
import org.apache.ibatis.jdbc.SQL;
import org.springframework.util.ObjectUtils;

/**
 * @author Lee
 * @created 2024/4/8
 * @describtion
 */
public class EmpMapperSqlProvider {
    /**
     * 通用列
     */
    private final String COMMON_COLUMN = "*";
    /**
     * 表名
     */
    private final String TABLE_NAME = "emp";

    /**
     * 将selectByPage和selectCount两个方法
     * 共有的方法提取出来
     *
     * @param dto 条件
     * @param sql SQL语句
     */
    private void selByPage(EmpQueryDTO dto, SQL sql) {
        if (!ObjectUtils.isEmpty(dto.getName())) {
            sql.WHERE("name like concat('%',#{name},'%')");
        }
        if (dto.getGender() != null) {
            sql.WHERE("gender = #{gender}");
        }
        if (dto.getBegin() != null && dto.getEnd() != null) {
            sql.WHERE("entry_date between #{begin} and #{end}");
        }
        if (dto.getBegin() != null && dto.getEnd() == null) {
            sql.WHERE("entry_date > #{begin} ");
        }
        if (dto.getEnd() != null && dto.getBegin() == null) {
            sql.WHERE("entry_date <  #{end} ");
        }
    }

    /**
     * 给 EmpMapper 中 selectCount 提供 SQL 语句
     *
     * @param dto 条件
     * @return SQL语句
     */
    public String selectByPage(EmpQueryDTO dto) {
        SQL sql = new SQL();
        sql.SELECT(COMMON_COLUMN).FROM(TABLE_NAME);
        selByPage(dto, sql);
        sql.LIMIT("#{page} ,#{pageSize}");
        return sql.toString();
    }


    /**
     * 给 EmpMapper 中 selectCount 提供 SQL 语句
     *
     * @param dto 条件
     * @return SQL 语句
     */
    public String selectCount(EmpQueryDTO dto) {
        SQL sql = new SQL();
        sql.SELECT(" count(*) ").FROM(TABLE_NAME);
        selByPage(dto, sql);
        return sql.toString();
    }

}
